package org.basis.algorithm.recursion;

/**
 * 数字转换为字符串
 * 规定1和A对应、2和B对应、3和C对应... 那么一个数字字符串比如"111"，就可以转化为"AAA"、"KA"和"AK"。 给定一个只有数字字符组成的字符串str，返回有多少种转化结果。
 *
 * @author Mr_wenpan@163.com 2021/12/29 22:51
 */
public class ConvertToLetterString {

    public static void main(String[] args) {

    }

    public static int convert(char[] chars, int i) {
        if (i == chars.length) {
            return 1;
        }

        if (chars[i] == '0') {
            // 0不能单独转换，所以只有有0位单独的一位则此次转换一定是失败的
            return 0;
        }
        if (chars[i] == '1') {
            // i位置就单独选择这个字符，看看i+1位置到最后能不能组合成一个新的字符串
            int res = convert(chars, i + 1);
            // i位置和他后面的数字组合，看看i+2位置到最后能不能组合成一个新的字符串
            res += convert(chars, i + 2);
            return res;
        }
        if (chars[i] == '2') {
            // i位置就单独选择这个字符,看看i+1位置到最后能不能组合成一个新的字符串
            int res = convert(chars, i + 1);
            if (i + 1 < chars.length && chars[i + 1] >= '0' && chars[i + 1] <= '6') {
                // i位置和他后面的数字组合，看看i+2位置到最后能不能组合成一个新的字符串。这里i+1位置的数必须要求介于 [0,6]
                res += convert(chars, i + 2);
            }
            return res;
        }

        // 其他数字不可和后面的一起组合为一个新字符，所以只能单独自己组成一个字符
        return convert(chars, i + 1);
    }
}
